/*	Nama file		: command.h
	Deskripsi		: Realisasi type dan prototype primitif mesin Command
	Nama pembuat	: Karina Novita Suryani/ 23512187
	Hari / Tanggal	: Kamis, 4 Oktober 2012
*/

#include "command.h"
#include <stdio.h>

/*** Parse and Execute Command ***/
void parseCommand(char* src, char* delimiter, char** tokenCommand,int *i){
/* Proses : Memparsing command yang dimasukkan menjadi array of command */
/* I.S. src dan delimiter tidak mungkin kosong */
/* F.S. src telah terparsing menjadi array of command pad tokenCommand dan i bernilai jumlah argumen command */
	/*Kamus Lokal*/

	/*Algoritma*/
	*i = 0;
	tokenCommand[*i] = strtok(src,delimiter);
	
	while (tokenCommand[*i] != NULL){
		(*i)++;
		tokenCommand[*i] = strtok(NULL,delimiter);
	}
	
}

void executeCommand(ListCal *C, char** tokenCommand, int countCommand){
/* Proses : mengeksekusi command yang dimasukkan oleh user */
/* I.S. Command user telah ditokenisasi menjadi array of command dan telah terhitung jumlah commandnya*/
/* F.S. command user tereksekusi berdasarkan jenis commanndnya*/
	/*Kamus Lokal*/

	/* Algoritma*/
	if (countCommand > 0){
			if (countCommand == 1){
				if (strcmp(tokenCommand[0],"create")== 0) {
					//create empty calender
					CreateCalender(C);
				} else if (strcmp(tokenCommand[0],"add")== 0) {
					//add event to calender
					AddNewEvent(C);
				} else if (strcmp(tokenCommand[0],"viewall")== 0) {
					// view all calender
					ViewAll(*C);
				} else if (strcmp(tokenCommand[0],"quit")== 0) {
					//quit
					Quit(C);
				} else { //command tidak terdaftar
					printf("command tidak terdaftar\n");
				}
			} 
			
			else if (countCommand == 2){
				//printf("count = 2");
				if (strcmp(tokenCommand[0],"load")== 0) {
					// load <filename>.txt to Calender
					LoadFile(C,tokenCommand[1]);
				} else if (strcmp(tokenCommand[0],"view")== 0) {
					// view event with #entryNo
					if (atoi(tokenCommand[1])!=0){
						ViewByEventNo(*C,atoi(tokenCommand[1]));
					} else {
						printf("nilai harus berupa integer\n");
					}
				} else if (strcmp(tokenCommand[0],"delete")== 0) {
					//delete event to calender
					if (atoi(tokenCommand[1])!=0){
						DeleteEvent(C,atoi(tokenCommand[1]));
					} else {
						printf("nilai harus berupa integer\n");
					}
				} else if (strcmp(tokenCommand[0],"edit")== 0) {
					//edit event to calender
					if (atoi(tokenCommand[1])!=0){
						EditEvent(C,atoi(tokenCommand[1]));
					} else {
						printf("Nilai harus berupa integer\n");
					}
				} else if (strcmp(tokenCommand[0],"save")== 0) {
					//save to <filename>.txt
					
					SaveFile(*C,tokenCommand[1]);
				} else { // command tidak terdaftar
					printf("command tidak terdaftar\n");
				}
			} 
			
			else if (countCommand == 3){
				if (strcmp(tokenCommand[0],"view")== 0){
					if (atoi(tokenCommand[1]) != 0){ // berhasil mengubah string to integer
						if (strcmp(tokenCommand[2],"first")== 0){
							//view n first
							ViewFirstNRows(*C,atoi(tokenCommand[1]));
						} else if (strcmp(tokenCommand[2],"last")== 0){
							//view n last
							ViewLastNRows(*C,atoi(tokenCommand[1]));
						} else {
							printf("command tidak terdaftar\n");
						}
					} else {  // gagal mengubah string to integer
						printf("nilai harus berupa integer atau lebih dari 0.\n");
					}
				} else { 
					printf("command tidak terdaftar\n");
				}
			} 
			
			else {
				printf("command tidak terdaftar\n");
			}
		} else{
			printf("Tidak ada command yang diinputkan\n");
		}
}

/*** CRUD ***/
void CreateCalender(ListCal *C){
/* Proses : membuat kalender kosong */
/* I.S. sembarang */
/* F.S. kalender kosong terbentuk */

	/*Kamus Lokal*/
	
	/*Algoritma*/
	if (mainState == INIT){//Kalender belum diinisialisasi
		CreateEmpty(C);
		mainState = CREATED;	//ganti status
	} else { // Kalender sudah diinisialisasi atau Kalender sudah ada isinya
		if (!IsEmpty(*C)){
			DelCal(C); //Dealokasi kalender menjadi kalender kosong
		}
	}
	
	
	printf("Kalender kosong telah dibuat\n");
}

void AddNewEvent(ListCal *C){
/* Proses : menambahkan event baru ke dalam kalender*/
/* I.S. sembarang */
/* F.S. event baru dibaca dan dimasukkan ke dalan kalender*/

	/*Kamus Lokal*/
	Event eventTemp;
	
	/*Algoritma */
	if (mainState == CREATED) {//Kalender telah diinisialisasi
		AddEvent(C);
	} else{
		printf("Kalender belum dibuat\n");
	}
}

void EditEvent(ListCal *C, int ENum){
/* Proses : mengedit event dengan nomor Enum ke dalam kalender*/
/* I.S. C mungkin kosong, event dengan nomor Enum mungkin tidak ada di kalender*/
/* F.S. Jika C kosong atau tidak ada event dengan nomor ENum maka munculkan pesan kesalahan
		jika ada, event ENum telah diedit*/

	/*Kamus Lokal*/
	
	/*Algoritma*/
	if (mainState == CREATED) { //kalender telah diinisialisasi
	
		if (IsEmpty(*C)){ //kalender kosong
			printf("Kalender kosong!\n");
		} else {
			if(SearchEvent(*C,ENum)== NULL){ //Event tidak terdaftar di calender
				printf("Event dengan nomor %d tidak ditemukan\n",ENum);
			} else { //Event terdaftar di calender
				Update(C,ENum);
			}
		}
		
	} else{
		printf("Kalender belum dibuat\n");
	}
	
}

void DeleteEvent(ListCal *C, int ENum){
/* Proses : menghapus event dengan nomor Enum ke dalam kalender*/
/* I.S. C mungkin kosong, event dengan nomor Enum mungkin tidak ada di kalender*/
/* F.S. Jika C kosong atau tidak ada event dengan nomor ENum maka munculkan pesan kesalahan
		jika ada, event ENum telah dihapus*/
	
	/*Kamus Lokal*/
	
	/*Algoritma*/
	if (mainState == CREATED) { //Kalender telah diinisialisasi
	
		if (IsEmpty(*C)){ //kalender kosong
			printf("Kalender kosong!\n");
		} else {
			if(SearchEvent(*C,ENum)== NULL){ //Event tidak terdaftar di calender
				printf("Event dengan nomor %d tidak ditemukan\n",ENum);
			} else { //Event terdaftar di calender
				DelParam(C,ENum);
				printf("Event dengan nomor %d telah dihapus\n",ENum);
			}
		}
		
	} else{
		printf("Kalender belum dibuat\n");
	}
	
}

/*** Primitif View ***/
void ViewByEventNo(ListCal C, int ENum){
/* Proses : Menampilkan event dengan nomor Enum di dalam C */
/* I.S. C mungkin kosong*/
/* F.S. Event dengan nomor Enum tampil di layar*/
	
	/*Kamus Lokal*/
	
	/*Algoritma*/
	if (mainState == CREATED) {//Kalender telah diinisialisasi
	
		if (IsEmpty(C)){ //Kalender Kosong
			printf("Kalender kosong!\n");
		} else {
			ViewEvent(C, ENum);
		}
		
	} else{
		printf("Kalender belum dibuat\n");
	}
	
}

void ViewFirstNRows(ListCal C, int N){
/* Proses: Menampilkan N event pertama di dalam C */
/* I.S. C mungkin kosong */
/* F.S. Event sebanyak N tampil di layar */
	/*Kamus Lokal*/
	
	/* Algoritma */
	if (mainState == CREATED) {//Kalender telah diinisialisasi
	
		if(IsEmpty(C)){//Kalender Kosong
			printf("Kalender kosong!\n");
		}
		else if(N<1){//Jumlah yang ditampilkan kurang dari 1
			printf("Jumlah event harus lebih besar dari 1\n");
		}
		else{
			ViewNFirst(C,N);
		}
		
	} else{
		printf("Kalender belum dibuat\n");
	}
	
}

void ViewLastNRows(ListCal C, int N){
/* Proses: Menampilkan N event terakhir di dalam C */
/* I.S. C mungkin kosong */
/* F.S. Event sebanyak N terakhir tampil di layar */
	/* Kamus Lokal */
		
	/* Algoritma */
	if (mainState == CREATED) {//Kalender telah diinisialisasi
	
		if(IsEmpty(C)){//Kalender kosong
			printf("Kalender kosong!\n");
		}
		else if(N<1){//Jumlah yang ditampilkan kurang dari 1
			printf("Jumlah event harus lebih besar dari 1\n");
		}
		else{
			ViewNLast(C,N);
		}
		
	} else{
		printf("Kalender belum dibuat\n");
	}

}

void ViewAll(ListCal C){
/* Proses: Menampilkan semua event di dalam C dalam bentuk kalender */
/* I.S. C mungkin kosong */
/* F.S. Semua event tampil di layar dalam bentuk kalender */
	/*Kamus Lokal*/
	
	/*Algoritma*/
	if (mainState == CREATED) {//Kalender telah diinisialisasi
	
		if(IsEmpty(C)){//Kalender kosong
			printf("Kalender kosong!\n");
		}
		else{
			ViewListCal(C);
		}
		
	} else{
		printf("Kalender belum dibuat\n");
	}
}

/*** Save/Load File ***/
 void SaveFile(ListCal C, char* FileName){
 /* Proses: Menyimpan kalender ke dalam file */
/* I.S. sembarang */
/* F.S. kalender telah disimpan ke dalam file dengan nama FileName.txt */
	/*Kamus Lokal*/
	
	/*Algoritma*/
	if (mainState == CREATED) {//Kalender telah diinisialisasi
	
		SaveFileCal(FileName,C);
		printf("Kalender telah disimpan ke %s\n",FileName);
		
	} else{
		printf("Kalender belum dibuat\n");
	}
 }
 
 void LoadFile(ListCal *C, char* FileName){
  /* Proses: membaca FileName.txt dan memasukkan isinya ke dalam kalender */
/* I.S. sembarang */
/* F.S. Jika FileName.txt ada maka isi FileName.txt dimasukkan ke dalam kalender 
		Jika tidak, muncul pesan kesalahan*/
	
	/*Kamus Lokal*/
	
	/*Algoritma*/
	if (mainState == CREATED) {//Kalender telah diinisialisasi
	
		if(IsEmpty(*C)){//Kalender kosong
			ReadFileCal (FileName, C);
			printf("Kalender telah diload dari %s\n",FileName);
		}
		else{
			DelCal(C);
			ReadFileCal(FileName,C);
			printf("Kalender telah diload dari %s\n",FileName);
		}
		
	} else{
		printf("Kalender belum dibuat\n");
	}
 }

 /*** Primitif lain ***/
 void Quit(ListCal *C){
 /* Proses: Mengganti status mainState*/
/* I.S. sembarang */
/* F.S. mainSTate = QUIT */
	/*Kamus Lokal*/
	
	/*Algoritma*/
	
	if (mainState == CREATED) {//Kalender telah diinisialisasi
		DelCal(C); //dealokasi calender
	} 
					
	mainState = QUIT;
 }
